<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// ES5 -> ECMAScript5
// ES5兼容问题：IE9+基本都支持

// ES5新增的主要内容：

// ES5的严格模式：ES5新增的一种代码运行模式
// ES5的严格模式是为了后面的版本做铺垫

// 如何开启严格模式？
// 在要执行的代码前面添加 'use strict' 字符串就可以开启严格模式
// 'use strict';
// console.log( '全局严格模式 1' );
// console.log( '全局严格模式 2' );
// console.log( '全局严格模式 3' );

// function test(){
//     'use strict';
//     console.log( '局部严格模式 1' );
//     console.log( '局部严格模式 2' );
//     console.log( '局部严格模式 3' );
// }
// test();

// 严格模式的一些限制：

// 1.变量声明必须使用var，否则报错
// 'use strict';
// var a = 1;// 显式声明变量
// b = 2;// 隐式声明变量
// console.log( a );
// console.log( b );


// 2.对于不合理的操作直接报错，不再做静默失败处理
// 'use strict';
// var str = 'hello';
// console.log( str.length );// 5
// str.length = 3;// 只读属性，不能修改
// console.log( str.length );// 5

// 'use strict';
// var abc = 123;
// delete window.abc;
// console.log( abc );

// 'use strict';
// NaN = 123;
// console.log( NaN );


// 3.禁止对象属性重名
// IE浏览器支持该限制，谷歌、火狐不支持
// 'use strict';
// var obj = {
//     name: '张三',
//     age: 23,
//     sex: '男',
//     name: '李四'
// }
// console.log( obj.name );// '李四'


// 4.禁止函数的形参重名
// 'use strict';
// function test(a,b,c,a){
//     console.log( a+b+c );// 4 + 2 + 3
// }
// test(1,2,3,4);// 9


// 5.禁止使用以0开头的八进制数
// 'use strict';
// var num1 = 024;// 八进制数  报错
// console.log( num1 );// 20 十进制
// 推荐使用0o开头表示八进制数
// 推荐使用0x开头表示十六进制数
// var num2 = 0o24;// 八进制数
// var num3 = 0x24;// 十六进制数
// console.log( num2 );// 20
// console.log( num3 );// 36


// 6.禁止使用with语句（普通模式也不推荐使用）


// 7.强制为eval创建新的作用域
// eval()将传入的字符串解析成js代码并执行
// var str1 = 'alert(123)';
// eval(str1);

// 'use strict';
// eval('var hehe = "呵呵"');
// console.log( hehe );// 呵呵


// 8.arguments不再追踪形参的变化(形参和arguments不再相互影响)
// 'use strict';
// var x = 1;
// function fun(x){
//     x = 2;
//     console.log( arguments[0] );// 2  1
//     arguments[0] = 3;
//     console.log( x );// 3  2
// }
// fun(x);// fun(1)
// console.log( x );// 1  1


// 9.函数中禁止this直接指向window对象，指向undefined
// 'use strict';
// function show(){
//     console.log( this );
// }
// show();// undefined
// window.show();// window


// 10.函数必须声明在全局或函数内部
// function fn1(){}
// function fn2(){
//     function fn3(){}
// }

// 'use strict';
// if (123) {
//     function fn(){
//         console.log( 123 );
//     }
// } else {
//     function fn(){
//         console.log( 456 );
//     }
// }
// fn();






</script>
</body>
</html>